/**
 * Copyright (C), 2013-2019, 中商惠民科技有限公司
 * FileName: 双向链表
 * FileName: 双向链表
 * Author:   Eilen
 * Date:     2019/4/26 14:21
 * Description:
 * History:
 * <author>          <time>          <version>          <desc>
 **/
package com.algorithm.basic;

/**
 * 〈describe〉<br>
 * 〈〉
 *
 * @author Eilen
 * @create 2019/4/26
 * @since 1.0.0
 */
public class 双向链表 {

    static Node node1 = new Node("name1");
    static Node node2 = new Node("name2");
    static Node node3 = new Node("name3");
    static Node node4 = new Node("name4");
    static Node node5 = new Node("name5");

    public static void main(String[] args) {

        //设置指针
        setPoint();
        //循环遍历
        System.out.println();
        System.out.println("初始链表");

        System.out.println();
        //插入节点在node2的后面
        addNode(node2, node3);

        //开始循环
        System.out.println();
        System.out.println("循环遍历");
        out(node1, node5);
        System.out.println();
        //删除节点
        node3.setNextNode(node5);
        node5.setNextNodef(node3);
        out(node1,node5);
    }

    /**
     * 双向量表增加一个节点
     *
     * @param node2
     * @param node3
     */
    public static void addNode(Node node2, Node node3) {
        Node node = new Node();
        node.setName("name2.5");
        node.setNextNode(node2.getNextNode());
        node2.setNextNode(node);

        node.setNextNodef(node3.getNextNodef());
        node3.setNextNodef(node);
    }

    public static void outLinked(Node startNode) {
        Node node = new Node();
        node.setNextNode(startNode);
        do {
            node = node.getNextNode();
            System.out.println(node.getName() + "-------");
        } while (node.getNextNode() != null);
    }

    public static void outLinedF(Node endNode) {
        Node node = new Node();
        node.setNextNodef(endNode);
        do {
            node = node.getNextNodef();
            System.out.println(node.getName() + "=========");
        } while (node.getNextNodef() != null);
    }

    public static void out(Node startNode, Node endNode) {
        System.out.println("正向循环");
        outLinked(startNode);
        System.out.println();
        System.out.println("逆向循环");
        outLinedF(endNode);
    }

    public static void setPoint() {
        //正向指针
        node1.setNextNode(node2);
        node2.setNextNode(node3);
        node3.setNextNode(node4);
        node4.setNextNode(node5);
        //反向指针
        node5.setNextNodef(node4);
        node4.setNextNodef(node3);
        node3.setNextNodef(node2);
        node2.setNextNodef(node1);
    }

}
